#ifndef GAMEENGINE_CORE_DATA_TYPE_H
#define GAMEENGINE_CORE_DATA_TYPE_H

#include <GameEngine/Core/core_settings.h>

#ifdef GAMEENGINE_NAMESPACES
namespace GameEngine {
#endif

//! Enumerates all possible data types that can be used
enum DataType {
	//! Boolean data
	/*!
	 *  Boolean data are stored on one byte (true/false)
	 */
	Boolean,
	//! Short integer data
	/*!
	 *  Short integer data are stored on two bytes, from -32768 to 32767
	 */
	ShortInteger,
	//! Unsigned short integer data
	/*!
	 *  Unsigned short integer data are stored on two bytes, from 0 to 65535
	 */
	UnsignedShortInteger,
	//! Integer data
	/*!
	 *  Integer data are stored on four bytes, from -2147483648 to 2147483647
	 */
	Integer,
	//! Unsigned integer data
	/*!
	 *  Unsigned integer data are stored on four bytes, from 0 to 4294967295
	 */
	UnsignedInteger,
	//! Long integer data
	/*!
	 *  Long integer data are stored on four bytes, from -2147483648 to 2147483647
	 *  Long integer type is similar to the integer type
	 */
	LongInteger,
	//! Unsigned long integer data
	/*!
	 *  Unsigned long integer data are stored on four bytes, from 0 to 4294967295
	 *  Unsigned long integer type is similar to the unsigned integer type
	 */
	UnsignedLongInteger,
	//! Char data
	/*!
	 *  Char data are stored on one byte, from -128 to 127
	 */
	Char,
	//! Unsigned char data
	/*!
	 *  Unsigned char data are stored on one byte, from 0 to 255
	 */
	UnsignedChar,
	//! Float data
	/*!
	 *  Float data are stored on four bytes, and range in +/- 3.4e +/- 38 (~7 digits)
	 */
	Float,
	//! Double data
	/*!
	 *  Double data are stored on eight bytes, and range in +/- 1.7e +/- 308 (~15 digits)
	 */
	Double,
	//! Long double data
	/*!
	 *  Long double data are stored on eight bytes, and range in +/- 1.7e +/- 308 (~15 digits)
	 *  Long double type is similar to the double type
	 */
	LongDouble,
	//! Custom data
	/*!
	 *  The number of bytes for custom data is unpredictable and depends on the type of stored data
	 */
	Custom,
	//! Composite data
	/*!
	 *  The number of bytes for composite data is unpredictable and depends on the type of stored data
	 */
	Composite,
	//! Unknown data type
	/*!
	 *  The number of bytes for unknown data is unpredictable
	 */
	Unknown
};


//! Convenience class used to get the type of data associated to type T
template <class T>
class DataTypes {

public:
	static DataType get_type();
};

#ifdef GAMEENGINE_NAMESPACES
} // namespace GameEngine
#endif

#include <GameEngine/Core/Data/data_type.hpp>

#endif